#define _CRT_SECURE_NO_WARNINGS
// ↑ 将本行在代码放在第一行可以避免 scanf的报错问题（仅在VS编译器里）
//【进阶篇】160.文本和二进制
//【进阶篇】161.休息|跳过重复内容
//【进阶篇】162.程序环境和预处理
//【进阶篇】163.休息
//【进阶篇】164.预处理（上）

#define MAX 100
#define str "hello bit"
#define print printf("hello\n")

#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#include<errno.h>
#include<string.h>

int main()
{
	//文本和二进制
	{
		int a = 10000;
		FILE* pf = fopen("test.txt", "wb");
		fwrite(&a, 4, 1, pf);
		fclose(pf);
		pf = NULL;
	}
	//预处理_预定义符号
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			printf("file:%s line=%d i = %d\n", __FILE__, __LINE__, i);
			printf("date:%s time=%s\n", __DATE__, __TIME__);
		}
	}
	return 0;
}
//160.文本和二进制：根据数据的组成形式分为两种文件
	//二进制文件：在内存中以二进制形式存储
	//文本文件：以ASCII码形式转换的为文本
	//文件读取结束的判断
		//文本文件读取结束 返回EOF（fgetc）或NULL(fgets)
		// 二进制文件读取结束 返回值是否小于实际要读的个数（fread）
		// 而feof是在文件读取结束时判断是什么原因导致的读取结束（是失败还是读取到结尾），并非用来判断读取结束
	//文件缓冲区：系统自动在内存中为程序中每个打开的文件开辟一个文件缓冲区
	//程序数据区和硬盘之间利用 输入、输出缓冲区进行数据的传递
//162.程序环境和预处理
	// 程序存在两个不同的环境
		//程序翻译环境：将源代码转化为可执行的机器指令（二进制）
		//程序执行环境：执行相关的代码
	//程序翻译环境
		//每个【源文件】(.c)（头文件内容会合成到源文件）都会经过编译器（cl.exe）处理生成【目标文件】(.obj(windows_vs)|.o(linux_gcc))
		//【库函数】通过链接器(link.exe)最终和目标文件一同生成可执行程序
		//所以程序文件通过【-编译->>链接-】生成可执行程序，其中编译还分为【-预编译|预处理->>编译->>汇编-】三个阶段
		//【预编译|预处理】阶段（文本的操作） gcc -E
			// 将头文件进行包含，将头文件和代码整合；
			// 将#define定义的符号替换为数值，并删除定义的符号；
			// 原始代码中的注释文字删除等；
		//【编译】阶段                         gcc -s
			// 将C语言代码转化为汇编代码（进行语法分析、词法分析、符号汇总、语义分析）
			// 符号汇总：会将代码中全局的符号进行汇总(包括：全局变量名、函数名、符号名等)
		//【汇编】阶段                       gcc -c 
			// 将汇编代码转化为二进制指令，即机器指令，同时【基于编译的符号汇总】形成符号表
		//【链接】阶段
			//将编译后的目标文件和链接库合并成一个可执行程序文件 
			//合并段表、符号表合并和重定位 
	//程序执行环境：执行相关的代码
		//程序必须载入内存中->>之后找到程序入口main->>开始执行程序代码->>终止程序
//164.预处理（上）	
	//预定义符号：
		//__FILE__ 执行编译的源文件
		//__LINE__ 文件当前行号
		//__DATE__ 文件被编译日期
		//__TIME__ 文件被编译时间
		//__STDC__  如果编译器遵循ANSI C,则改值为1否则未定义
	//define定义：
		//定义符号：可以定义数字、字符串、字符、甚至可以是一段代码、关键字等


	
